/*
===========================================================================

Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.

This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").

Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code.  If not, see <http://www.gnu.org/licenses/>.

In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code.  If not, please request a copy in writing from id Software at the address below.

If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.

===========================================================================
*/

#include "Precompiled.h"
#include "globaldata.h"



#include "doomdef.h"

#include "s_sound.h"

#include "p_local.h"


// Data.
#include "sounds.h"

// State.
#include "r_state.h"



//
// TELEPORTATION
//
int
EV_Teleport
( line_t*	line,
  int		side,
  mobj_t*	thing )
{
	int		i;
	int		tag;
	mobj_t*	m;
	mobj_t*	fog;
	unsigned	an;
	thinker_t*	thinker;
	sector_t*	sector;
	fixed_t	oldx;
	fixed_t	oldy;
	fixed_t	oldz;

	// don't teleport missiles
	if( thing->flags & MF_MISSILE )
	{
		return 0;
	}

	// Don't teleport if hit back of line,
	//  so you can get out of teleporter.
	if( side == 1 )
	{
		return 0;
	}


	tag = line->tag;
	for( i = 0; i < ::g->numsectors; i++ )
	{
		if( ::g->sectors[ i ].tag == tag )
		{
			thinker = ::g->thinkercap.next;
			for( thinker = ::g->thinkercap.next;
					thinker != &::g->thinkercap;
					thinker = thinker->next )
			{
				// not a mobj
				if( thinker->function.acp1 != ( actionf_p1 )P_MobjThinker )
				{
					continue;
				}

				m = ( mobj_t* )thinker;

				// not a teleportman
				if( m->type != MT_TELEPORTMAN )
				{
					continue;
				}

				sector = m->subsector->sector;
				// wrong sector
				if( sector -::g->sectors != i )
				{
					continue;
				}

				oldx = thing->x;
				oldy = thing->y;
				oldz = thing->z;

				if( !P_TeleportMove( thing, m->x, m->y ) )
				{
					return 0;
				}

				thing->z = thing->floorz;  //fixme: not needed?
				if( thing->player )
				{
					thing->player->viewz = thing->z + thing->player->viewheight;
				}

				// spawn teleport fog at source and destination
				fog = P_SpawnMobj( oldx, oldy, oldz, MT_TFOG );
				S_StartSound( fog, sfx_telept );
				an = m->angle >> ANGLETOFINESHIFT;
				fog = P_SpawnMobj( m->x + 20 * finecosine[an], m->y + 20 * finesine[an]
								   , thing->z, MT_TFOG );

				// emit sound, where?
				S_StartSound( fog, sfx_telept );

				// don't move for a bit
				if( thing->player )
				{
					thing->reactiontime = 18;
				}

				thing->angle = m->angle;
				thing->momx = thing->momy = thing->momz = 0;
				return 1;
			}
		}
	}
	return 0;
}


